package partFour.homeWork.code.code03;


import java.io.*;

/**
 * 实现对目录下所有内容copy到另一个目录下
 */


public class FileCopy {

    // 实现对目录中有的文件进行copy
    // 采用有缓存的基于字节的流 对源文件读取，读取到的内容后写入目标文件中
    public static void fileCopy(String targetPath, String originPath){
        BufferedOutputStream bos = null;
        BufferedInputStream bis = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(originPath));
            bos = new BufferedOutputStream(new FileOutputStream(targetPath));
            //  创建一个字节大小的缓存区
            byte[] bytesArr = new byte[8*1024];
            int res = 0;
            //  只要读取的有内容，就不断写入目标文件中
            while ((res = bis.read(bytesArr)) != -1){
                bos.write(bytesArr,0,res);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //  关闭各种流
            if (null !=bis ){
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != bos){
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }

    // 实现对源目录中所有子目录读取,并且当读取到的是目录是，进行在复制后的目录下创建此目录结构；
    // 当读取的是文件时，进行调用复制文件方法，对文件进行复制。
    public static void dirCopy(String targetDir, String originDir){
        File originDirFile = new File(originDir);
        File targetDirFile = new File(targetDir);
        // 判断复制后的目录是否存在
        if (!targetDirFile.exists()){
            targetDirFile.mkdirs();
            System.out.println("复制后的文件路径"+targetDirFile+"已创建！");
        }

        //  获取源目录的目录结构，存放在filesArray数组中
        File[] filesArray = originDirFile.listFiles();
        for (File f : filesArray) {
            //  如果是文件，则直接调用复制文件的方法进行复制
            if (f.isFile()){
                FileCopy.fileCopy(targetDirFile.getAbsolutePath()+"/"+f.getName(),f.getAbsolutePath());
                System.out.println("文件"+f.getName()+",已复制！");
            }
            //  如果是目录，则采用回调函数，对其目录进行创建。
            else if (f.isDirectory()){
                FileCopy.dirCopy(targetDirFile.getAbsolutePath()+"/"+f.getName(),f.getAbsolutePath());
            }
        }

    }

}
